<?php

namespace core\libs;

class paramFilter {

	// 自动过滤post,get,request内恶意的参数
    public function __construct() {
        foreach($_REQUEST as $key => $val) {
            if (!is_array($_REQUEST[$key]))	{
                $_REQUEST[$key] = htmlentities($this->escape(addslashes(trim($_REQUEST[$key]))));
                if(isset($_GET[$key])) $_GET[$key] = $_REQUEST[$key];
                if(isset($_POST[$key])) $_POST[$key] = $_REQUEST[$key];
            }
            else {
                foreach($_REQUEST[$key] as $k => $v) {
                    $_REQUEST[$key][$k] = htmlentities($this->escape(addslashes(trim($v))));
                    if(isset($_GET[$key][$k])) $_GET[$key][$k] = $_REQUEST[$key][$k];
                    if(isset($_POST[$key][$k])) $_POST[$key][$k] = $_REQUEST[$key][$k];
                }
            }
        }
    }

	/*
	 * (通用版)
	 * @进行安全字段和xss跨站脚本攻击过滤
	 */
	protected function escape($string) {
		global $_POST;
		$search = array (
			'/</i',
			'/>/i',
			'/\">/i',
			'/\bunion\b/i',
			'/load_file(\s*(\/\*.*\*\/)?\s*)+\(/i',
			'/into(\s*(\/\*.*\*\/)?\s*)+outfile/i',
			'/\bor\b/i',
			'/\<([\/]?)script([^\>]*?)\>/si',
			'/\<([\/]?)iframe([^\>]*?)\>/si',
			'/\<([\/]?)frame([^\>]*?)\>/si'
		);
		$replace = array (
			'<',
			'>',
			'">',
			'union ',
			'load_file  (',
			'into  outfile',
			'or ',
			'<\\1script\\2>',
			'<\\1iframe\\2>',
			'<\\1frame\\2>'
		);
		if (is_array ( $string )) {
			$key = array_keys ( $string );
			$size = sizeof ( $key );
			for($i = 0; $i < $size; $i ++) {
				$string [$key [$i]] = $this->escape ( $string [$key [$i]] );
			}
		} else {
			if (!isset($_POST['stats_code']) && !isset($_POST['ad_type_code_content'])) {
				$string = str_replace ( array (
					'\n',
					'\r'
				), array (
					chr ( 10 ),
					chr ( 13 )
				), preg_replace ( $search, $replace, $string ) );
				$string = $this->RemoveXSS ( $string );
			} else {
				$string = $string;
			}
		}
		return $string;
	}
    
	/**
	 * @过滤XSS（跨站脚本攻击）的函数
	 * @par $val 字符串参数，可能包含恶意的脚本代码如<script language="javascript">alert("hello world");</script>
	 * @return  处理后的字符串
	 **/
	protected function RemoveXSS($val) {  
	   // remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed  
	   // this prevents some character re-spacing such as <java\0script>  
	   // note that you have to handle splits with \n, \r, and \t later since they *are* allowed in some inputs  
	   // $val = preg_replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '', $val);  
	   $val = preg_replace('/([\x00-\x08\x0b-\x0c\x0e-\x19])/', '', $val);  
	 
	   // straight replacements, the user should never need these since they're normal characters  
	   // this prevents like <IMG SRC=@avascript:alert('XSS')>  
	   $search = 'abcdefghijklmnopqrstuvwxyz'; 
	   $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';  
	   $search .= '1234567890!@#$%^&*()'; 
	   $search .= '~`";:?+/={}[]-_|\'\\'; 
	   for ($i = 0; $i < strlen($search); $i++) { 
		  // ;? matches the ;, which is optional 
		  // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars 
	 
		  // @ @ search for the hex values 
		  $val = preg_replace('/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val); // with a ; 
		  // @ @ 0{0,7} matches '0' zero to seven times  
		  $val = preg_replace('/(&#0{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // with a ; 
	   } 
	 
	   // now the only remaining whitespace attacks are \t, \n, and \r 
	   // $ra1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base'); 
	   $ra1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'base'); 
	   $ra2 = Array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload'); 
	   $ra = array_merge($ra1, $ra2); 
	 
	   $found = true; // keep replacing as long as the previous round replaced something 
	   while ($found == true) { 
		  $val_before = $val; 
		  for ($i = 0; $i < sizeof($ra); $i++) { 
			 $pattern = '/'; 
			 for ($j = 0; $j < strlen($ra[$i]); $j++) { 
				if ($j > 0) { 
				   $pattern .= '(';  
				   $pattern .= '(&#[xX]0{0,8}([9ab]);)'; 
				   $pattern .= '|';  
				   $pattern .= '|(&#0{0,8}([9|10|13]);)'; 
				   $pattern .= ')*'; 
				} 
				$pattern .= $ra[$i][$j]; 
			 } 
			 $pattern .= '/i';  
			 $replacement = substr($ra[$i], 0, 2).'<x>'.substr($ra[$i], 2); // add in <> to nerf the tag  
			 $val = preg_replace($pattern, $replacement, $val); // filter out the hex tags  
			 if ($val_before == $val) {  
				// no replacements were made, so exit the loop  
				$found = false;  
			 }  
		  }  
	   }  
	   return $val;  
	}
}